#include "ProblemElementalL2Error.h"
#include "CFDProblem.h"

template<>
InputParameters validParams<ProblemElementalL2Error>()
{
  InputParameters params = validParams<ElementIntegralPostprocessor>();
  params += validParams<MultiVariableInterface>();
  return params;
}

ProblemElementalL2Error::ProblemElementalL2Error(const InputParameters &parameters) :
	ElementIntegralPostprocessor(parameters),
	MultiVariableInterface(parameters),
	_cfd_problem(static_cast<CFDProblem&>(_fe_problem)),
	_cfd_data(_cfd_problem),
	_cfd_data_exact(_cfd_problem)
{
	// foreach(MooseVariable *var, _variables)
	for(auto var : _variables)
		addMooseVariableDependency(var);
}

Real ProblemElementalL2Error::getValue()
{
  return std::sqrt(ElementIntegralPostprocessor::getValue());
}

Real ProblemElementalL2Error::computeQpIntegral()
{
	_cfd_problem.valueExact(_cfd_data_exact.uh, _t, _q_point[_qp]);
	Real err =  (*_uh[0])[_qp] - _cfd_data_exact.uh[0];
	return err*err;
}
